#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <semaphore.h>

_PROTOTYPE ( int main, (void));
int main()
{
   /* Declaracion de variables */
   sem_t a, b, c, boc;
   int iter;
   int res;
   res=sem_init(&a,1,1);
   res+=sem_init(&b,1,1);
   res+=sem_init(&c,1,0);
   res+=sem_init(&boc,1,0);
   /* Chequeo si se produjo algun error */
   if(res < 0){
	printf("error \n");
	return -1;
   }
   /* Procesos */
   if(fork() == 0){
        if(fork() == 0){
            /* a */
            /* Asigno los semaforos, recordar que las asignaciones no se heredan */
	    res=sem_assign(&a,1,1);
	    res=sem_assign(&boc,1,0);
	    iter = 0;
    	    while(iter < 20){
                sem_wait(&a);
                /* Zona critica */
                printf("a");   
                fflush(stdout);
		sem_post(&boc);
                iter++;
            }
        }
        else{
            /* b */
	    iter=0;
	    res=sem_assign(&a,1,1);
	    res=sem_assign(&boc,1,0);
	    res=sem_assign(&b,1,1);
	    res=sem_assign(&c,1,0);
            while(iter < 10){
                sem_wait(&b);
                sem_wait(&boc);
                printf("b" );
                iter++;
                fflush(stdout); 
                sem_post(&c);
                sem_post(&a);
            }
        }
    }
    else{
        /* c */
	iter = 0;
	while(iter < 10){
	    sem_wait(&c);
            sem_wait(&boc);
            printf("c-");
            iter++;
	    fflush(stdout);
	    sem_post(&a);
            sem_post(&b);
	}
        /* Como c va a terminar ultimo, le encargo que libere los semaforos */
        res=sem_destroy(&a);
	res+=sem_destroy(&b);
        res+=sem_destroy(&c);
	res+=sem_destroy(&boc);
	if(res < 0){
	     printf("error \n");
	     return -1;
	}
   }
   return 0;
}

